﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace mi2project
{
    public class EsVagyFa2
    {
        public EsVagyFa2()
        {
            csucsok = new Hashtable();
        }

        public int Melyseg()
        {
            int maxMelyseg = 0;
            foreach (DictionaryEntry csucs in csucsok)
            {
                if (maxMelyseg < ((Csucs2)csucs.Value).getMelyseg())
                    maxMelyseg = ((Csucs2)csucs.Value).getMelyseg();
            }
            return maxMelyseg;
            //throw new Exception("The method or operation is not implemented.");
        }

        public bool IsLiteral(int sorszam) { return (((Csucs2)csucsok[sorszam]).getAxioma().isLiteral()); }

        public void startCsucsBeszurasa(int sorszam, Axioma axioma)
        {
            if (csucsok.Count == 0)
            {
                Csucs ujCsucs = new Csucs(-1, sorszam, 0, axioma);
                if (!(ujCsucs.getAxioma().isLiteral()))
                {
                    if (ujCsucs.getAxioma().foMuveletiJelJele() == "&")
                    {
                        ujCsucs.setGyerekekTipusa(GyerekekTipusa.es);
                    }
                    else if (ujCsucs.getAxioma().foMuveletiJelJele() == "|")
                    {
                        ujCsucs.setGyerekekTipusa(GyerekekTipusa.vagy);
                    }
                }
                csucsok.Add(sorszam, ujCsucs);
            }
        }

        public void csucsBeszuras(int sorszam, int szuloCsucs, Axioma axioma, BizonyitasTipusa2 t)
        {
            int szuloMelysege = ((Csucs2)csucsok[szuloCsucs]).getMelyseg();
            Csucs2 ujCsucs = new Csucs2(szuloCsucs, sorszam, szuloMelysege + 1, axioma);
            if (!(ujCsucs.getAxioma().isLiteral()))
            {
                if (ujCsucs.getAxioma().foMuveletiJelJele() == "&")
                {
                    ujCsucs.setGyerekekTipusa(GyerekekTipusa2.es);
                }
                else if (ujCsucs.getAxioma().foMuveletiJelJele() == "|")
                {
                    ujCsucs.setGyerekekTipusa(GyerekekTipusa2.vagy);
                }
            }
            else
            {
                if (t == BizonyitasTipusa2.elore)
                {
                    ujCsucs.setGyerekekTipusa(GyerekekTipusa2.implikacioLe);
                }
                else if (t == BizonyitasTipusa2.vissza)
                {
                    ujCsucs.setGyerekekTipusa(GyerekekTipusa2.implikacioFel);
                }
            }
            //ujCsucs.setSzulo(szuloCsucs);
            csucsok.Add(sorszam, ujCsucs);
            ((Csucs2)csucsok[szuloCsucs]).gyerekeihezAd(sorszam);


        }

        public void levelCsucsTorlese(int sorszam)
        {
            if (((Csucs2)csucsok[sorszam]).getGyerekei().Count == 0)
            {
                ((Csucs2)csucsok[((Csucs2)csucsok[sorszam]).getSzulo()]).gyerekeibolElvesz(sorszam);
                csucsok.Remove(sorszam);
            }
        }

        public Axioma getCsucsAxioma(int sorszam)
        {
            return ((Csucs2)csucsok[sorszam]).getAxioma();
        }

        public int egyCsucsSzuloje(int sorszam)
        {
            return ((Csucs2)csucsok[sorszam]).getSzulo();
        }

        public List<int> egyCsucsGyerekei(int sorszam)
        {
            return ((Csucs2)csucsok[sorszam]).getGyerekei();
        }

        public GyerekekTipusa2 getCsucsGyerekeinekTipusa(int sorszam)
        {
            return ((Csucs2)csucsok[sorszam]).getGyerekekTipusa();
        }

        public void setCsucsGyerekeinekTipusa(int sorszam, GyerekekTipusa2 tipus)
        {
            ((Csucs2)csucsok[sorszam]).setGyerekekTipusa(tipus);
        }

        public Hashtable getCsucsok()
        {
            return csucsok;
        }
        /*
        public void kirajzolas(int csucsSzama)
        {
            elozoek = new List<int>();
            kirajzoltCsucs = csucsSzama;
            kirajzoloForm = new Form();
            kirajzoloForm.Text = "Bizonyítás";
            kirajzoloForm.Size = new Size(300, 150);
            csucsLB = new Label();
            csucsLB.Text = csucsok[csucsSzama].getAxioma().axiomaNezete();
            csucsLB.AutoSize = true;
            csucsLB.Location = new Point(10, 100);
            kirajzoloForm.Controls.Add(csucsLB);
            szuloLB = new Label();
            szuloLB.Text = csucsok[csucsok[csucsSzama].getSzulo()].getAxioma().axiomaNezete();
            szuloLB.Location = new Point(10, 10);
            szuloLB.AutoSize = true;
            kirajzoloForm.Controls.Add(szuloLB);
            EsVagyLB = new Label();
            if (csucsok[csucsok[csucsSzama].getSzulo()].getGyerekekTipusa() == GyerekekTipusa.es)
                EsVagyLB.Text = "És";
            else
                EsVagyLB.Text = "Vagy";
            EsVagyLB.AutoSize = true;
            EsVagyLB.Location = new Point(40, 50);
            kirajzoloForm.Controls.Add(EsVagyLB);
            Button felBT = new Button();
            felBT.Text = "Fel";
            felBT.Location = new Point(250, 20);
            felBT.Size = new Size(30, 30);
            kirajzoloForm.Controls.Add(felBT);
            Button leBT = new Button();
            leBT.Text = "Le";
            leBT.Location = new Point(250, 55);
            leBT.Size = new Size(30, 30);
            kirajzoloForm.Controls.Add(leBT);
            kirajzoloForm.Show();
            kirajzoloForm.Paint += new System.Windows.Forms.PaintEventHandler(kirajzoloForm_Paint);
            felBT.Click += new System.EventHandler(felBT_Click);
            leBT.Click += new System.EventHandler(leBT_Click);
        }

        private void kirajzoloForm_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen pen = new Pen(Color.Black);
            g.DrawLine(pen, 20, 25, 20, 95);
        }

        private void felBT_Click(object sender, EventArgs e)
        {
            if (egyCsucsSzuloje(kirajzoltCsucs) != 0)
            {
                elozoek.Add(kirajzoltCsucs);
                kirajzoltCsucs = csucsok[kirajzoltCsucs].getSzulo();
                ujraRajzolas(kirajzoltCsucs);
            }
        }

        private void leBT_Click(object sender, EventArgs e)
        {
            if (elozoek.Count != 0)
            {
                ujraRajzolas(elozoek[elozoek.Count - 1]);
                kirajzoltCsucs = elozoek[elozoek.Count - 1];
                elozoek.Remove(elozoek[elozoek.Count - 1]);
            }
        }

        private void ujraRajzolas(int csucsSzama)
        {
            csucsLB.Text = csucsok[csucsSzama].getAxioma().axiomaNezete();
            szuloLB.Text = csucsok[egyCsucsSzuloje(csucsSzama)].getAxioma().axiomaNezete();
            if (csucsok[csucsok[csucsSzama].getSzulo()].getGyerekekTipusa() == GyerekekTipusa.es)
                EsVagyLB.Text = "És";
            else
                EsVagyLB.Text = "Vagy";
        }

        private Label csucsLB;
        private Label szuloLB;
        private Label EsVagyLB;
        private int kirajzoltCsucs;
        private List<int> elozoek;
        private Form kirajzoloForm;
         */

        public int csucsokSzama()
        {
            return csucsok.Count;
        }

        private Hashtable csucsok;
    }



}